﻿/*----------------------------------------------------------------------------------------
*
*  Copyright 2019, Gao Hai Hui, <fromzeropoint@126.com>.  All rights reserved.
*  https://gitee.com/helloworldghh/xoskit.git
*  Use of this source code is governed by a MIT license
*  that can be found in the License file.
*
----------------------------------------------------------------------------------------*/
#include "../import/head.h"
#include "../global/head.h"
#include "odbc_field.h"

namespace xos_odbc
{

    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 

    static odbc_field::POOL * pool_ptr = 0;

    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 

    odbc_field::odbc_field()
    {
        init_data();
    }

    odbc_field::~odbc_field()
    {
        term();
    }

    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // public method

    int odbc_field::get_addr( POOL *** pppPool, LIST *** pppList )
    {
        int ret = 0;
        if( pppPool )
        {
            *pppPool = &pool_ptr;
        }
        if( pppList )
        {
            *pppList = 0;
        }
        return ret;
    }

    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // public method

    int odbc_field::bind_param( i_stmt * pStmt )
    {
        int ret = 0;

        switch( m_eType )
        {
        case i_stmt::VT_CHAR_ARRAY:
            {
                ret = pStmt->bind_param( m_nIndex, char_ptr, 0, &len_or_ptr );
            }
            break;
        case i_stmt::VT_DOUBLE:
            {
                ret = pStmt->bind_param( m_nIndex, double_ptr, m_nDigitnum, &len_or_ptr );
            }
            break;
        case i_stmt::VT_FLOAT:
            {
                ret = pStmt->bind_param( m_nIndex, float_ptr, m_nDigitnum, &len_or_ptr );
            }
            break;
        case i_stmt::VT_I64:
            {
                ret = pStmt->bind_param( m_nIndex, i64_ptr, &len_or_ptr );
            }
            break;
        case i_stmt::VT_I32:
            {
                ret = pStmt->bind_param( m_nIndex, i32_ptr, &len_or_ptr );
            }
            break;
        case i_stmt::VT_I8:
            {
                ret = pStmt->bind_param( m_nIndex, i8_ptr, &len_or_ptr );
            }
            break;
        case i_stmt::VT_I16:
            {
                ret = pStmt->bind_param( m_nIndex, i16_ptr, &len_or_ptr );
            }
            break;
        case i_stmt::VT_U64:
            {
                ret = pStmt->bind_param( m_nIndex, u64_ptr, &len_or_ptr );
            }
            break;
        case i_stmt::VT_U32:
            {
                ret = pStmt->bind_param( m_nIndex, u32_ptr, &len_or_ptr );
            }
            break;
        case i_stmt::VT_U8:
            {
                ret = pStmt->bind_param( m_nIndex, u8_ptr, &len_or_ptr );
            }
            break;
        case i_stmt::VT_U16:
            {
                ret = pStmt->bind_param( m_nIndex, u16_ptr, &len_or_ptr );
            }
            break;
        case i_stmt::VT_BOOL:
            {
                ret = pStmt->bind_param( m_nIndex, bool_ptr, &len_or_ptr );
            }
            break;
        default:
            {
                ret = 1;
            }
            break;
        }

        return ret;
    }

    int odbc_field::bind_col( i_stmt * pStmt )
    {
        int ret = 0;

        switch( m_eType )
        {
        case i_stmt::VT_CHAR_ARRAY:
            {
                ret = pStmt->bind_colum( m_nIndex, char_ptr, m_nBufSize, &len_or_ptr );
            }
            break;
        case i_stmt::VT_DOUBLE:
            {
                ret = pStmt->bind_colum( m_nIndex, double_ptr, &len_or_ptr );
            }
            break;
        case i_stmt::VT_FLOAT:
            {
                ret = pStmt->bind_colum( m_nIndex, float_ptr, &len_or_ptr );
            }
            break;
        case i_stmt::VT_I64:
            {
                ret = pStmt->bind_colum( m_nIndex, i64_ptr, &len_or_ptr );
            }
            break;
        case i_stmt::VT_I32:
            {
                ret = pStmt->bind_colum( m_nIndex, i32_ptr, &len_or_ptr );
            }
            break;
        case i_stmt::VT_I8:
            {
                ret = pStmt->bind_colum( m_nIndex, i8_ptr, &len_or_ptr );
            }
            break;
        case i_stmt::VT_I16:
            {
                ret = pStmt->bind_colum( m_nIndex, i16_ptr, &len_or_ptr );
            }
            break;
        case i_stmt::VT_U64:
            {
                ret = pStmt->bind_colum( m_nIndex, u64_ptr, &len_or_ptr );
            }
            break;
        case i_stmt::VT_U32:
            {
                ret = pStmt->bind_colum( m_nIndex, u32_ptr, &len_or_ptr );
            }
            break;
        case i_stmt::VT_U8:
            {
                ret = pStmt->bind_colum( m_nIndex, u8_ptr, &len_or_ptr );
            }
            break;
        case i_stmt::VT_U16:
            {
                ret = pStmt->bind_colum( m_nIndex, u16_ptr, &len_or_ptr );
            }
            break;
        case i_stmt::VT_BOOL:
            {
                ret = pStmt->bind_colum( m_nIndex, bool_ptr, &len_or_ptr );
            }
            break;
        default:
            {
                ret = 1;
            }
            break;
        }

        return ret;
    }

    int odbc_field::clear_value()
    {
        int ret = 0;

        switch( m_eType )
        {
        case i_stmt::VT_CHAR_ARRAY:
            {
                g_pSysData->m_pContainer->crt()->memset( char_ptr, 0, m_nBufSize );
            }
            break;
        case i_stmt::VT_DOUBLE:
            {
                *double_ptr = 0;
            }
            break;
        case i_stmt::VT_FLOAT:
            {
                *float_ptr = 0;
            }
            break;
        case i_stmt::VT_I64:
            {
                *i64_ptr = 0;
            }
            break;
        case i_stmt::VT_I32:
            {
                *i32_ptr = 0;
            }
            break;
        case i_stmt::VT_I8:
            {
                *i8_ptr = 0;
            }
            break;
        case i_stmt::VT_I16:
            {
                *i16_ptr = 0;
            }
            break;
        case i_stmt::VT_U64:
            {
                *u64_ptr = 0;
            }
            break;
        case i_stmt::VT_U32:
            {
                *u32_ptr = 0;
            }
            break;
        case i_stmt::VT_U8:
            {
                *u8_ptr = 0;
            }
            break;
        case i_stmt::VT_U16:
            {
                *u16_ptr = 0;
            }
            break;
        case i_stmt::VT_BOOL:
            {
                *bool_ptr = false;
            }
            break;
        default:
            {
                ret = 1;
            }
            break;
        }

        len_or_ptr = 0;

        return ret;
    }

    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // protected method

    int odbc_field::init_data()
    {
        int ret = 0;

        m_eType = i_stmt::VT_I32;
        m_name = "";
        m_nIndex = -1;
        m_nDigitnum = 4;
        m_nBufSize = 0;
        i64_ptr = 0;
        len_or_ptr = 0;
        m_bIsKey = false;
        m_bDirty = true;

        return ret;
    }

    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // public method

    int odbc_field::init()
    {
        int ret = 0;
        return ret;
    }

    int odbc_field::term()
    {
        int ret = 0;

        init_data();

        return ret;
    }

    int odbc_field::release()
    {
        int ret = 0;

        term();
        put_back_to_pool( this, true );

        return ret;
    }

} // xos_odbc
